package pers.vic.practice;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Arrays;
import java.util.stream.Collectors;

/**
 * 描述: 页面置换抽象类
 * <p>
 *     输入：被分配物理块个数 n，页面序列；
 *     输出：访问顺序，缺页率。
 * </p>
 * @author Vic.xu
 * @date 2022-04-01 16:33
 */
public abstract class AbstractPageReplacement {

    /**
     * ，页面置换；输出：访问顺序，缺页率
     *
     * @param n 被分配物理块个数 n
     * @param pagesSequence 页面序列
     */
    abstract void replace(int n, int[] pagesSequence);

    /**
     *  获得到缺页描述
     * @param pagesSequence pages sequence
     * @return description of pages sequence
     */
    protected String getPagesSequenceDesc(int[] pagesSequence){
        return Arrays.stream(pagesSequence).boxed().map(String::valueOf).collect(Collectors.joining("-"));
    }

    /**
     * 打印出页面缺页率
     * @param missNumber 未命中次数
     * @param  total    总访问次数
     */
    protected void  printPageMissRate(int missNumber, int total){
        BigDecimal rate = BigDecimal.valueOf(((float) missNumber / total) * 100).setScale(2, RoundingMode.HALF_UP);
        String sb = "总访问次数：" + total +
                ",命中次数：" + missNumber +
                ",命中率：" + rate.toString() + "%";
        System.out.println(sb);
    }

    /**
     * 打印页面序列
     */
    protected void printPagesSequence(String strategy, int n, int[] pagesSequence){
        System.out.println("【" + strategy + "算法】：物理页数：" + n + " 页面序列："   + getPagesSequenceDesc(pagesSequence));
    }

}
